#include "inserir.h"

/* funcao que retorna o valor do nrr inicial da avail list */
int verifica_avail(int position) {
	
		char aux[dig_nrr+2];
		FILE * avail_head;
		
		avail_head = fopen("avail_head.dat", "r");
		fseek(avail_head, position*dig_nrr, SEEK_SET);
		fgets(aux, dig_nrr+1,avail_head);
		aux[dig_nrr+1] = '\0';
		fclose(avail_head);
		
		return atoi(aux);
		
}

/* devolve o nrr da cabeca da avail list e atualiza seu valor */
int insere(FILE *base, int position, int tamanho) {
	
	FILE * avail_head;
		int atual;
		int nrr;
		char aux[dig_nrr+2];
	
		nrr = verifica_avail(position);
		/* insere no final do base.dat */
		if(nrr == -1) {
				return 0;
		}
	
		/* insere no espaco disponivel da avail list */
		else {
				

				atual = (nrr - 1) * tamanho;

			/* armazena na string aux o nrr que esta no espaco disponivel da avail list */
				fseek(base, atual, SEEK_SET);	
				fgets(aux, dig_nrr+1, base);
				aux[dig_nrr+1] = '\0';


				
				/* coloca o nrr que estava no espaco disponivel para o inicio da avail list */
				avail_head = fopen("avail_head.dat", "r+");
				fseek(avail_head, position*dig_nrr, SEEK_SET);
				fputs(aux, avail_head);
				fclose(avail_head);
				return nrr;
		}
}





/*
   Aceita ate "tamanho" caracteres e tem um espaco a mais para o "/0", indicando final da string. Caso nao sejam digitados todos os caracteres, completa com espaço e coloca o "/0" no final, que nao eh escrito no .dat. A funcao ignora os caracteres adicionais (a partir de "tamanho + 1") e limpa o buffer no final. Caso a entrada seja vazia (primeiro caractere == '\n'), nao aceita e pede pra redigitar.
   */

void completa_espacos(char nome[], int tamanho) {
	int i;


	for (i=(strlen(nome)-1); i<tamanho; i++) {
		nome[i] = ' ';
	}
	nome[tamanho] = '\0';


}

void remove_espacos() {
	char c;

	c=getchar();
	while(c==' ') {
		c=getchar();
	}
	ungetc(c, stdin);

	return;
}

int verifica(int tamanho, char *string) {
	int i=0, v=0;	
	while(i<tamanho && string[i] != '\n') {
		if(!isdigit(string[i])) {
			v = 1;
			break;
		}

		i++;
	}
	return v;
}

int verifica_img(int tamanho, char imagem[]) {
	int i, j=0;
	for(i=0; i<tamanho-3 ; i++) {
		if(isdigit(imagem[i])) {
			j++;
		}
	}
	return j;
}

void Titulo(pNo_PK obras, char *tit, FILE *dados, int tamanho_vetor) {
	char titulo[tam_titulo+1];
	int erro =1;

	while(erro) {
		__fpurge(stdin);
		printf("Titulo (Ate %d caracteres): ", tam_titulo);	
		remove_espacos();
		fgets(titulo, tam_titulo+1, stdin);
		if (titulo[0] == '\n') {
			printf("Entradas vazias nao sao permitidas\n");
			continue;
		}
		completa_espacos(titulo, tam_titulo);
		if (bsearch (titulo, obras, tamanho_vetor, sizeof (struct No_PK), compara)) {
			printf("Essa obra ja foi incluida!\n");
		}
		else {
			break;
		}
	}
	fputs(titulo, dados);
	strcpy(tit,titulo);

}

/*
   Semelhante a funcao "Titulo()".
   */

void Tipo(FILE *dados) {
	char tipo[tam_tipo+1];


	__fpurge(stdin);
	printf("Tipo (Ate %d caracteres): ", tam_tipo);
	remove_espacos();
	fgets(tipo, tam_tipo+1, stdin);

	while(tipo[0] == '\n') {
		printf("Entradas vazias nao sao permitidas\n");
		printf("Tipo (Ate %d caracteres): ", tam_tipo);
		remove_espacos();
		fgets(tipo, tam_tipo+1, stdin);
	}
	completa_espacos(tipo, tam_tipo);


	fputs(tipo, dados);


	return;

}

/*
   Igual a funcao "Tipo()".
   */
void Autor(FILE *dados) {
	char autor[tam_autor+1];

	__fpurge(stdin);
	printf("Autor (Ate %d caracteres): ", tam_autor);
	remove_espacos();
	fgets(autor, tam_autor+1, stdin);
	while(autor[0] == '\n') {
		printf("Entradas vazias nao sao permitidas\n");
		printf("Autor (Ate %d caracteres): ", tam_autor);
		remove_espacos();
		fgets(autor, tam_autor+1, stdin);
	}

	completa_espacos(autor, tam_autor);

	fputs(autor, dados);

__fpurge(stdin);
	return;

}

/*
   So aceita numeros positivos, indo de 0 ate 9999 (maior numero com 4 digitos), caso nao esteja nesse intervalo, pede para redigitar. O ano tem valor inicial -1, para caso outros caracteres sejam digitado, o valor continue negativo e nao aceite a entrada. Limpa o buffer no final.
   */

void Ano(FILE *dados) {
	char ano[tam_ano+1];
	int j=0;
__fpurge(stdin);
	printf("Ano (%d numeros): ", tam_ano);
	remove_espacos();
	fgets(ano, tam_ano+2, stdin);
	j = verifica(tam_ano, ano);
	while(ano[0] == '\n' || j != 0) {

		j=0;
		printf("Entrada invalida, redigite por favor.\n");
		printf("Ano (%d numeros): ", tam_ano);
		remove_espacos();
		fgets(ano, tam_ano+2, stdin);
		__fpurge(stdin);
		j = verifica(tam_ano, ano);
	}

	completa_espacos(ano, tam_ano);

	__fpurge(stdin);
	fputs(ano, dados);

}
/* 
   Semelhante a funcao "Ano()", mas aceita ate 12 digitos
   */

void Valor(FILE *dados) {
	char valor[tam_valor+1];
	int j=0;

	printf("Valor (Ate %d numeros): ", tam_valor);
	remove_espacos();
	fgets(valor, tam_valor+2, stdin);
	j = verifica(tam_valor, valor);
	while(valor[0] == '\n' || j != 0) {

		j=0;
		printf("Entrada invalida, redigite por favor.\n");
		printf("Valor (Ate %d numeros): ", tam_valor);
		remove_espacos();
		fgets(valor, tam_valor+2, stdin);
		__fpurge(stdin);
		j = verifica(tam_valor, valor);
	}		

	completa_espacos(valor, tam_valor);
	__fpurge(stdin);
	fputs(valor, dados);

}
/*
   A imagem eh uma string com "tamanho" caracteres, sendo os "tamanho-3" primeiros apenas numeros, os 3 proximos a extensao "jpg" e o ultimo o "\0". A funcao "isdigit" retorna 0 caso o caractere nao seja um numero e algum numero diferente de 0 caso seja um numero. Assim, testamos para cada um dos "tamanho-3" primeiros caracteres e adicionamos 1 a "j" (variavel auxiliar) se for um numero. Caso j<"tamanho-3", nem todos sao numeros e a entrada nao deve ser aceita. A entrada tambem deve ter "jpg" como extensao.
   Caso mais de "tamanho" caracteres forem digitados, ignora a partir do caractere "tamanho+1" e limpa o buffer no final.
   Usamos tamanho-3 pois os ultimos 3 caracteres sao a extensao do arquivo e o outros devem ser numeros.

*/

void Imagem(FILE *dados) {
	char imagem[tam_imagem+1];
	char extensao[4];
	int j=0;
	while (1) {
		j=0;
		__fpurge(stdin);

		printf("Nome da imagem (%d caracteres, sendo: No. do seu grupo + %d numeros + jpg): ", tam_imagem, tam_imagem-5);
		remove_espacos();
		fgets(imagem, tam_imagem+1, stdin);
		__fpurge(stdin);

		if(imagem[0] == '\n') {
			printf("Entradas vazias nao sao permitidas\n");
			continue;
		}

		j = verifica_img (tam_imagem, imagem);	

		if(j<tam_imagem-3) { 
			printf("Digite o No. do seu grupo, em seguida o identificador (%d numeros) e a extensao da imagem.\n", tam_imagem-5);
			continue;
		}

		extensao[0] = imagem[tam_imagem-3];
		extensao[1] = imagem[tam_imagem-2];
		extensao[2] = imagem[tam_imagem-1];
		extensao[3] = '\0';

		if((strcmp(extensao, "jpg") && strcmp(extensao, "png") && strcmp(extensao, "gif"))) {
			printf("A extensao deve ser \"jpg\", \"png\" ou \"gif\"\n!");
			continue;
		}

		else {
			break;
		}

	}
	__fpurge(stdin);
	fputs(imagem, dados);
}


